perm filename TTYINI.MAC[HST,NET]1 blob
sn#785113 filedate 1985-02-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00030 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 <FINGER.SOURCES>TTYINI.MAC.38, 4-Dec-84 15:34:09, Edit by SATZ
C00008 00003
C00009 00004
C00010 00005 MACROS
C00014 00006 DATA AREA
C00021 00007 SUBTTL Impure data
C00025 00008
C00027 00009 STARTUP
C00032 00010 COMMAND HANDLERS
C00039 00011
C00044 00012
C00045 00013 COMMAND EXECUTION
C00049 00014
C00054 00015
C00057 00016
C00060 00017
C00063 00018
C00081 00019 CHECK HANDLER, TYPE ROUTINES
C00089 00020
C00092 00021 SUBTTL Binary file reading
C00094 00022
C00096 00023
C00099 00024
C00102 00025 SUBTTL Write binary file from raw data file
C00105 00026
C00106 00027
C00110 00028
C00112 00029
C00114 00030
C00115 ENDMK
C⊗;
;<FINGER.SOURCES>TTYINI.MAC.38, 4-Dec-84 15:34:09, Edit by SATZ
; Add the Concept AVT terminal type
;<FINGER>TTYINI.MAC.37, 31-May-84 15:47:16, Edit by LOUGHEED
; Add Freedom-200, ANSI, FR100, FR200, SUN terminal types
; Add documentation about the /DEFAULT switches
;<FINGER>TTYINI.MAC.36, 14-Apr-84 17:44:42, Edit by LOUGHEED
; Make sure ADDRESS field in binary file is null terminated
;<LOUGHEED>TTYINI.MAC.35, 21-Jan-84 21:42:00, Edit by LOUGHEED
; Turn on LOTSW and GSBSW so everyone can parse the same command file
;ACCT:<SU-UTILITIES>TTYINI.MAC.34, 7-Jan-84 14:23:36, Edit by R.RMK
; Up MAXLEN and ATMLEN. Tip-TermanA nuked us.
;ACCT:<SU-UTILITIES>TTYINI.MAC.33, 23-Nov-83 15:59:55, Edit by R.RMK
; Lite bits in 9 pages of host data, not just one.
;ACCT:<SU-UTILITIES>TTYINI.MAC.32, 18-Nov-83 16:22:01, Edit by R.RMK
; Had to fix COMTRM, too.
;ACCT:<SU-UTILITIES>TTYINI.MAC.31, 18-Nov-83 13:37:00, Edit by R.RMK
; Fix DIRECT - neighbor parsing had been broken.
;ACCT:<SU-UTILITIES>TTYINI.MAC.30, 18-Nov-83 12:27:41, Edit by R.RMK
; Import from Sierra:
; Add GIGI, LA38, TELEMEDIA, TI and VT125.
; Flush DEC SUDS terminals.
; Update help and remove spurious comments therein.
;<FINGER>TTYINI.MAC.29, 15-Nov-83 23:08:15, Edit by BURGESS
; Don't look in NET-CMD if just reading bin file
;<FINGER>TTYINI.MAC.28, 17-Oct-83 16:18:29, Edit by BURGESS
; Tip port mask is 77, not 7777
;<FINGER>TTYINI.MAC.27, 12-Oct-83 00:02:02, Edit by FMF
; When creating new net page make sure host page unmapped (don't create
; new net page in the middle of host page!)
;<FINGER>TTYINI.MAC.26, 6-Oct-83 16:58:09, Edit by FMF
; Make GSB have same things as LOTS
;<FINGER>TTYINI.MAC.25, 26-Sep-83 21:06:32, Edit by LOUGHEED
; Add Freedom-100, Esprit support
;<FINGER>TTYINI.MAC.24, 24-Sep-83 18:44:57, Edit by FMF
; Use PUPNM% to figure out host names rather than mapping the PUP-Network
; Directory.
; Move file definitions to .UNV file
; Use .TEXT instead of .MIC file to load
; /ETHERNET-DEFAULT, /INTERNET-DEFAULT, /NETWORK-DEFAULT, /DIALIN-DEFAULT,
; /PTY-DEFAULT, and /LOCAL-DEFAULT
; Allow multiple host numbers for each site (such as SUN-Test)
;<R.RMK>TTYINI.MAC.6, 19-Sep-83 12:53:38, Edit by R.RMK
; Simplify SETTTY.
;<R.RMK>TTYINI.MAC.5, 16-Sep-83 15:08:11, Edit by R.RMK
; Change to SYSTEM:TTYINI.NET* now that it's mostly debugged.
;<R.RMK>TTYINI.MAC.4, 16-Sep-83 11:34:04, Edit by R.RMK
; TTYINI.NET-CMD and TTYINI.NET-BIN instead of .CMD and .BIN
;<R.RMK>TTYINI.MAC.3, 15-Sep-83 15:29:06, Edit by R.RMK
; In HSTMAP, map the second host page on, not the first.
;<R.RMK>TTYINI.MAC.2, 15-Sep-83 12:19:30, Edit by R.RMK
; Flush CERAS 105, put office in its place.
;<R.RMK>TTYINI.MAC.1, 14-Sep-83 16:53:05, Edit by R.RMK
; This version is sufficiently new to justify flushing the previous
; edit history.
; Add network terminal support.
TITLE TTYINI - SET TERMINAL CHARACTERISTICS
SEARCH MONSYM,MACSYM,TINIDF,ANAUNV
.REQUIRE SYS:MACREL
.TEXT "/SYMSEG:PSECT:TTCODE"
.TEXT "TTYINI/SAVE"
.TEXT "/HASHSIZE:12007"
SALL
.PSECT VARBS,40000
.ENDPS
.PSECT PVARBS,50000
.ENDPS
.PSECT TTCODE,1000
VGROUP==4 ;EDIT BY CUSTOMER
VMAJOR==5
VMINOR==0
VEDIT==31
LOTSW==1
GSBSW==1
DEFINE DATE<ASCIZ \21-January-1984\>
A=1
B=2
C=3
D=4
E=5
;16 IS USED BY MACSYM
P=17
MAXCHR==↑D500
MAXLEN==<MAXCHR+5>/5
ABCHR==↑D100
ABLEN==<ABCHR+5>/5
PDLLEN==500 ; Plenty of stack.
DEFINE JCERR(TEXT)<
ERCAL [JSMSG<TEXT>
RET]>
DEFINE JSMSG(TEXT,CHAR)<
IFB<CHAR><TMSG <
?>>
IFNB<CHAR><TMSG <
CHAR>>
IFNB<TEXT><TMSG <TEXT: >>
CALL JSMSG0
>
DEFINE FMSG(TEXT)<
HRROI B,[ASCIZ \TEXT\]
SETZ C,
SOUT
>
DEFINE FCHR(CHR)<
MOVEI B,CHR
BOUT
>
DEFINE FVER<
FMSG (\VMAJOR)
IFN VMINOR,<
IFG VMINOR-↑D26,<
VMIN1==<VMINOR-1>/↑D26
FCHR <"A"+VMIN1-1>
>
VMIN1==VMINOR-<<VMINOR-1>/↑D26*↑D26>
FCHR <"A"+VMIN1-1>
>
IFN VEDIT,<
FCHR<"(">
FMSG(\VEDIT)
FCHR<")">
>
IFN VGROUP,<
FCHR<"-">
FMSG(\VGROUP)
>
>
SUBTTL MACROS
;LOAD A BLOCK WITH DATA AND ALLOCATE ENOUGH SPACE
;FOR LARGEST WORD
DEFINE LDBLK(LIST)<
..LEN==0
IRP LIST,<.LDWRD(LIST)>
.ORG .+..LEN
>
;USED TO STRIP OFF <>
DEFINE .LDWRD(A)<LDWRD(A)>
;LOAD 1 WORD CHECK MAX LENGTH
DEFINE LDWRD(A,B,C)<
.ORG .+<A>
IFNB<C><C:>
IFB<B>,<0;>B
.ORG .-<A>-1
IFGE <A>-..LEN,<..LEN==<A>+1>
>
;KEYWORD TABLE MACROS
DEFINE TABLE<
...BEG==.
BLOCK 1
>
DEFINE TEND<
...LEN==.-...BEG
.ORG ...BEG
...LEN-1,,...LEN
.ORG .+...LEN
>
DEFINE T(TEXT,VALUE)< [ASCIZ \TEXT\],,VALUE>
;LOAD A FUNCTION DESCRIPTOR BLOCK
;USE FLDDB. MACRO FROM MONSYM. ARGS AS FOLLOWS:
;FLDDB.(TYP,FLGS,DATA,HLPM,DEFM,LST)
;TYP COMND FUNCTION CODE (I.E. .CMKEY)
;FLGS FLAGS (I.E. CM%SDH, SUPPRESS DEFAULT HELP)
;DATA ARG TO SPECIFIC FUNCTION (I.E. RADIX FOR .CMNUM)
;HLPM USER SUPPLIED HELP STRING (AUTOMATICALLY SETS CM%HPP)
;DEFM DEFAULT STRING (AUTOMATICALLY SETS CM%DPP)
;LST POINTER TO NEXT FUNCTION DESCRIPTOR BLOCK
;DEFINE SINGLE DATA WORD (OR WORDS)
DEFINE DATA(ADDR,SIZE<1>)<
.PSECT VARBS
ADDR: BLOCK SIZE ;; Storage.
.ENDPS VARBS>
DEFINE PDATA(ADDR,SIZE<1>)<
.PSECT PVARBS
ADDR: BLOCK 1000*SIZE
.ENDPS PVARBS>
DEFINE CONFIRM(ERROR)<
CALL DOCFM
IFB<ERROR>< JRST COMERR>
IFNB<ERROR>< JRST ERROR>
>
DEFINE NIY<
TMSG <
?Not implemented yet.
>
JRST COMLOP
>
DEFINE COMINI(TEXT)<
IFNB<TEXT><HRROI A,[ASCIZ \TEXT\]>
IFB<TEXT><HRROI A,CMBUF>
MOVE B,[.PRIIN,,.PRIOU]
CALL DOINI
>
DEFINE FIELD(FDB,ERROR)<
MOVEI B,FDB
CALL DOCOM
IFB<ERROR>< JRST COMERR>
IFNB<ERROR>< JRST ERROR>
>
DEFINE RFIELD(FDB)<
MOVEI B,FDB
MOVEI A,CMSTAT
COMND
ERJMP ERSCAN
TXNE A,CM%NOP
JRST ERSCAN
>
DEFINE CHECK(ADDR,NAME)<
SKIPL ADDR
JRST [ SKIPE FILEF
RETSKP
TMSG <?Cannot give NAME more than once
>
RET]
>
DEFINE DEFAULT(SWIT,VAL)<
MOVEI A,VAL
SKIPGE SWIT
MOVEM A,SWIT
>
SUBTTL DATA AREA
EV: JRST STRT
JRST STRT
JOBVER: BYTE (3)VGROUP(9)VMAJOR(6)VMINOR(18)VEDIT
EVL==.-EV
CMSTAT: LDBLK(<<.CMFLG,REPARS>,<.CMIOJ,<.PRIIN,,.PRIOU>>,<.CMBFP,<-1,,CMBUF>>,<.CMPTR,<-1,,CMBUF>>,<.CMCNT,MAXCHR>,<.CMINC,0>,<.CMABP,<POINT 7,ABBUF>>,<.CMABC,ABCHR>,<.CMGJB,CMGJFN>>)
INIBLK: FLDDB.(.CMINI)
TTYINI: FLDDB.(.CMKEY,,RESKEY)
RESKEY: TABLE
T TTYINI,0
TEND
COMAND: FLDDB.(.CMCFM,,,,,COMSWT)
COMSWT: FLDDB.(.CMSWI,,TYPSWT,,,COMTYP)
TYPSWT: TABLE
T ADDRESS:,$ADDRE
IFN LOTSW!GSBSW,<
T ASSIGNABLE,$ASSIG
>;IFN LOTSW!GSBSW
T BINARY-FILE,$BINMK
IFN LOTSW!GSBSW,<
T CONSULTINGTERMINAL,$CONSU
>;IFN LOTSW!GSBSW
T DEFAULT-TYPE:,$DTYPE
T DIALIN-DEFAULT:,$DDEF
T ETHERNET-DEFAULT:,$EDEF
T EXIT,$EXIT
IFN LOTSW!GSBSW,<
T EXPRESSTERMINAL,$EXPRE
>;IFN LOTSW!GSBSW
T FILE:,$FILE
T FLAG,$FLAG
T FORMFEED,$FORM
T FULLDUPLEX,$FULL
T HALFDUPLEX,$HALF
T HELP,$HELP
T INTERNET-DEFAULT:,$IDEF
T LENGTH:,$LENGT
T LINE-HALFDUPLEX,$LHALF
T LOCAL-DEFAULT:,$LDEF
T LOCATION,$LOCAT
T LOWERCASE,$LOWER
T NETWORK-DEFAULT:,$NDEF
T NO-PAGE-SPEED:,%PGSPD
T NO-PAUSE-AT-END-OF-PAGE,%PAUSE
T NO-PAUSE-ON-COMMAND,%CTLS
T NOFILE,%FILE
T NOFLAG,%FLAG
T NOFORMFEED,%FORM
T NOLOWERCASE,%LOWER
T NORAISE,%RAISE
T NOTAB,%TAB
IFN LOTSW!GSBSW,<
T OPERATOR,$OPERA
T OVERHEAD,$OVERH
>;IFN LOTSW!GSBSW
T PAUSE-AT-END-OF-PAGE,$PAUSE
T PAUSE-ON-COMMAND,$CTLS
T PRINT-NODE:,$PRINT
T PTY-DEFAULT:,$PDEF
T RAISE,$RAISE
T RECEIVE-MESSAGES,%REFSY
T REFUSE-MESSAGES,$REFSY
T TAB,$TAB
IFN LOTSW!GSBSW,<
T TOBACK:,$TOBAC
T TODIAGONAL:,$TODIA
T TOFRONT:,$TOFRO
T TOGLASS:,$TOGLA
T TOLEFT:,$TOLEF
T TOPARTITION:,$TOPAR
T TORIGHT:,$TORIG
>;IFN LOTSW!GSBSW
T VT100-52,$10052
T VT100-ANSI,$100AN
T WIDTH:,$WIDTH
TEND
COMSPD: FLDDB.(.CMKEY,,SPDKEY,<
Speed at or below which to disable /PAUSE-ON-END-OF-PAGE,
>)
SPDKEY: TABLE
T 110,↑D110
T 1200,↑D1200
T 134,↑D134
T 150,↑D150
T 1800,↑D1800
T 200,↑D200
T 2400,↑D2400
T 300,↑D300
T 4800,↑D4800
T 50,↑D50
T 600,↑D600
T 75,↑D75
T 9600,↑D9600
TEND
COMTYP: FLDDB.(.CMKEY,,COMKEY)
COMDTY: FLDDB.(.CMKEY,,COMKEY)
COMKEY: TABLE
T 33,$TT33
T 35,$TT35
T 37,$TT37
T 43,$TT43
T ADM-3,$TTADM
T ALTO,$TTALT
T AMBASSADOR,$TTAMB
T ANN-ARBOR,$TTANN
T ANSI,$TTANS
T AVT,$TTAVT
T CHECK,-1
T CONCEPT-100,$TTCPT
T DATAMEDIA-1520,$TTDA2
T DATAMEDIA-2500,$TTDAM
T DEFAULT,$TTDEF
T DIABLO,$TTL36
T DM1520,$TTDA2
T DM2500,$TTDAM
T ESPRIT,$TTESP
T EXECUPORT,$TTEXE
T FR100,$TTFRD
T FR200,$TTFR2
T FREEDOM-100,$TTFRD
T FREEDOM-200,$TTFR2
T GIGI,$TTGG
T GILLOTINE,$TTGIL
T H19,$TTH19
T HAZELTINE-1500,$TTHAZ
T HEATH-19,$TTH19
T HP2645A,$TTHP
T IBM-3101,$TTIBM
T IDEAL,$TTIDL
T LA120,$TT120
T LA30,$TTL30
T LA34,$TTL34
T LA36,$TTL36
T LA38,$TTL38
T NVT,$TTIDL
T SOROC-IQ120,$TTSRC
T SUN,$TTSUN
T TEK4023,$TTTK3
T TEK4025,$TTTEK
T TEKTRONIX-4023,$TTTK3
T TEKTRONIX-4025,$TTTEK
T TELEMEDIA,$TTDAM
T TELERAY-1061,$TTTEL
T TELEVIDEO-912,$TTTVI
T TERMINET,$TTTRM
T TI,$TTTI
T VK100,$TTGG
T VT05,$TTV05
T VT100,$TT100
T VT125,$TT125
T VT50,$TTV50
T VT52,$TTV52
T ZENITH-19,$TTH19
TEND
COMCFM: FLDDB.(.CMCFM)
COMNUM: FLDDB.(.CMNUM,,↑D10)
COMLIN: FLDDB.(.CMCFM,,,,,COMSTR)
COMPLS: FLDDB.(.CMTOK,,<-1,,[ASCIZ/+/]>,,,COMHSH)
COMHSH: FLDDB.(.CMTOK,,<-1,,[ASCIZ/#/]>)
COMSTR: FLDDB.(.CMTOK,,<-1,,[ASCIZ /*/]>,,,CMDKEY)
CMDKEY: FLDDB. .CMKEY,,CMKEYS,,,COMOCT
CMKEYS: TABLE
T HOST,$HOST
TEND
COMHST: FLDDB. .CMFLD
COMTRM: FLDDB. .CMNUM,,10,,,COMHST
COMOCT: FLDDB.(.CMNUM,,10)
COMEOL: FLDDB.(.CMTXT)
COMFIL: FLDDB.(.CMFIL)
FILBLK: LDBLK(<<.GJGEN,GJ%OLD>,<.GJEXT,<-1,,[ASCIZ /CMD/]>>,<.GJNAM,[ASCIZ /TTYINI/]>>)
FILLEN==.-FILBLK
;SAMPLES OF OTHER BLOCKS
;NOISE: FLDDB.(.CMNOI,,<-1,,[ASCIZ /NOISE/]>)
;IFILE: FLDDB.(.CMIFI)
;OFILE: FLDDB.(.CMOFI)
;ARBFIL:FLDDB.(.CMFIL)
;FILBLK: LDBLK(<<.GJGEN,GJ%OLD>,<.GJEXT,<-1,,[ASCIZ /EXT/]>>,<.GJNAM,[ASCIZ /NAME/]>>)
;FILLEN==.-FILBLK
SUBTTL Impure data
DATA PDL,PDLLEN ; Stack
DATA CMGJFN,16 ; COMND% GTJFN% block
DATA CMBUF,MAXLEN ; COMND% parse buffer
DATA ABBUF,ABLEN ; COMND% atom buffer
DATA BINFLG ; If non-zero, we're generating a binary file
DATA THELIN ; The current TTY line out of the command file
DATA REPPDL
DATA REPPC
DATA SYSCOM
DATA PTY0
DATA OURLIN
DATA EXITS
DATA HELPS
DATA CHANGE
DATA FILEF
DATA IJFN
DATA SAVMOD
DATA PASS
DATA DATBEG,0 ; Start of initialized data area.
DATA TYPE
DATA DTYPE
DATA EXITF
DATA FLAGF
DATA FORMF
DATA HELPF
DATA LENGTH
DATA LINEF
DATA LOWERF
DATA PAUSEF
DATA CTLSF
DATA SPEED
DATA RAISEF
DATA TABF
DATA WIDTH
DATA VT100F
DATA FJFN
DATA REFSYS
DATA PRINT,2
DATA LOCAT
DATA ADDRE,6
IFN LOTSW!GSBSW,<
DATA ASSIG
DATA CONSU
DATA EXPRE
DATA OVERH
DATA OPERA
>;IFN LOTSW!GSBSW
DATA DIRARR,8
DATA DATEND,0 ; End of data to be initialized
DATA NETNUM ; -1, have not seen HOST command line...else
; net number of host working on in binary file.
DATA HSTNUM ; -1, have not seen HOST command line...else
; host number of host working on in binary file
DATA NETJFN ; JFN for TTYINI.NET-BIN when reading/writing.
DATA MAPNET ; Positive, page number mapped in NETPAG
DATA MAPHST ; Positive, page number mapped in HSTPAG
DATA NUMHST ; Positive, number of pages mapped at HSTPAG
DATA FILPAG ; Page number in binary file to be created.
DATA NTDJFN ; JFN for SYSTEM:PUP-NETWORK.DIRECTORY
DATA MULHST ;This is a host with multiple entries
DATA HSTNMS,3 ;Numbers if have multiple hosts|
DATA LCLNET ; Local net number (that this host is on)
DATA LCLHST ; This host
DATA FSTPNV ; Number of first PNV on system
DATA NUMPNV ; Number of PNVs on system
DATA FSTTVT ;Number of first TVT on system
DATA NUMTVT ;Number of TVTs
DATA FSTPTY ;Number of first PTY
DATA NUMPTY ;Number of PTYs on system
DATA PARNUM ; Number of PUPPAR table
.PSECT VARBS
DATALN==:DATEND-DATBEG
.ENDPS VARBS
DATA TMPARG,DATALN
PDATA TTYPGA ; TTYINI.NET-BIN's first page
TTYPAG==:TTYPGA/1000
PDATA NETPGA ; Where NET page gets mapped
NETPAG==:NETPGA/1000 ; Table of page pointers to host TTYINI data
MAXPAG==:100 ; Allow 64 pages
PDATA HSTPGA,MAXPAG ; Allow MAXPAG pages of host TTYINI data
HSTPAG==:HSTPGA/1000
PDATA TEMP ; One temporary page.
;TERMINAL TYPE TABLE FOR ANSI RESPONSE TO <ESC>Z
ANSITB:
T100AN: ;LABEL USED FOR /VT100-52
$TT100,,[ASCIZ /VT100]/] ; (1) VT100
$TT120,,[ASCIZ /LA120]/] ; (2) LA120
$TTL34,,[ASCIZ /LA34]/] ; (3) LA34
ANSIMX==.-ANSITB
;TERMINAL TYPE TABLE FOR DEC RESPONSE TO <ESC>Z
DEFINE DECENT(LETTER,ROUTINE,TYPE,ADDR)<
LDWRD(<<"LETTER">-<"A">>,<ROUTINE,,[ASCIZ \TYPE]\]>,ADDR)
>
DECTAB:
..LEN==0
DECENT A,$TTV50,VT50
DECENT H,$TTV50,VT50
DECENT C,$TTV52,VT52
DECENT K,$TTV52,VT52
DECENT L,$TTV52,VT52
DECENT (Z,$TTV52,<VT100(VT52)>,T10052) ;T10052 USED BY /VT100-ANSI
DECENT E,$TTV52,<VT55(VT52)>
DECMAX==..LEN
.ORG DECTAB+DECMAX
SUBTTL STARTUP
STRT: RESET%
MOVE P,[IOWD PDLLEN,PDL]
MOVE A,['PTYPAR']
SYSGT%
HRRZM A,PTY0
MOVE A,['PUPPAR'] ; Get information about PNVs.
SYSGT%
HRRZM A,FSTPNV ; Number of first PNV.
HLRZM A,NUMPNV ; Number of PNVs.
HRRZM B,PARNUM ; Number of PUPPAR table for later use.
MOVE A,['PTYPAR'] ;Want info on PTYs
SYSGT% ;Get it
HRRZM A,FSTPTY ;Number of first PTY
HLRZM A,NUMPTY ;Number of PTYs
MOVX A,TCP%NT ;Want number of TVTs
STAT% ;Try to get it
IFJER.
SETOM FSTTVT ;Set a quite unlikely TVT number
SETOM NUMTVT ;And an even more unlikely number of TVTs
ELSE.
HRRZM B,FSTTVT ;Save first TVT number
HLROM B,NUMTVT ;Get -num of tvts
MOVNS NUMTVT ;Make it positive
ENDIF.
CALL INIHST ; Get local host net/number
SETOM SYSCOM
GJINF
JUMPE A,NOLOG ;NOT LOGGED IN - MUST USE FILE
SETZ A,
RSCAN
ERJMP ERSCAN
JUMPE A,ERSCAN
COMINI()
RFIELD(TTYINI) ;MUST START WITH PROGRAM NAME, OR NO ERRORS
MOVEI B,COMCFM
MOVEI A,CMSTAT
COMND
ERJMP REPAR1
TXNE A,CM%NOP
JRST REPAR1
NOLOG: SETOM DATBEG
MOVE A,[DATBEG,,DATBEG+1]
BLT A,DATEND-1
SETZM CHANGE
AOS CHANGE
JRST COMDON ;GO DO TYPE FROM FILE
ERSCAN: HRROI A,[0]
RSCAN
ERJMP .+1
SETZM SYSCOM
TMSG <TTYINI VERSION >
MOVEI A,.PRIOU
LDB B,[POINT 9,JOBVER,11] ;MAJOR
MOVEI C,10
NOUT
JCERR
LDB B,[POINT 6,JOBVER,17] ;MINOR
JUMPE B,NOMINR
SUBI B,1
IDIVI B,↑D26
JUMPE B,NOMINF
MOVEI A,"A"-1(B)
PBOUT
NOMINF: MOVEI A,"A"(C)
PBOUT
NOMINR: HRRZ B,JOBVER ;EDIT
JUMPE B,NOEDIT
TMSG <(>
MOVEI A,.PRIOU
MOVEI C,10
NOUT
JCERR
TMSG <)>
NOEDIT: LDB B,[POINT 3,JOBVER,2]
JUMPE B,NOGRP
TMSG <->
MOVEI A,.PRIOU
MOVEI C,10
NOUT
JCERR
NOGRP: TMSG <, >
HRROI A,[DATE]
PSOUT
TMSG <.
>
COMLOP: CALL CLEAN
SKIPE SYSCOM
HALTF
COMLP1: SETZM SYSCOM
HRROI A,[ASCIZ /TTYINI>/]
MOVE B,[.PRIIN,,.PRIOU]
CALL DOINI
CALL CLEAN
REPAR1: SETZM CHANGE
SETZM FILEF
SETZM BINFLG ;NOT CREATING A BINARY FILE
SETOM DATBEG
MOVE A,[DATBEG,,DATBEG+1]
BLT A,DATEND-1
COMNXT: FIELD(COMAND)
HRRZ B,(B)
MOVE A,B
HRRZ C,C
CAIN C,COMAND
JRST COMDON ;CONFIRMED
CAIN C,COMTYP
MOVEI A,SETTYP
CALL (A)
JRST COMERR
JRST COMNXT
REPARS: MOVE P,REPPDL
MOVE A,REPPC
MOVEM A,(P)
RET
DOINI: MOVEM A,CMSTAT+.CMRTY
MOVEM B,CMSTAT+.CMIOJ
MOVE A,(P)
MOVEM A,REPPC
MOVEM P,REPPDL
MOVEI A,CMSTAT
MOVEI B,INIBLK
COMND
ERJMP FATAL
TXNN A,CM%NOP
RET
FATAL: JSHLT
DOCFM: MOVEI B,COMCFM
DOCOM: MOVEI A,CMSTAT
COMND
ERJMP R
TXNE A,CM%NOP
RET
RETSKP
COMERR: JSMSG <Command error>
JRST COMLOP
CLEAN: MOVX A,CZ%NCL!FLD(.FHSLF,CZ%PRH)
CLZFF
JCERR <Failed to release unopened JFNs>
RET
COMEND: SKIPL EXITF
HALTF
JRST COMLOP
SUBTTL COMMAND HANDLERS
$DDEF: FIELD(COMDTY,R)
CALL CHKDIA ;Are we a dialin?
RETSKP ;No, go back
JRST %DTYPE ;Go do the processing
$EDEF: FIELD(COMDTY,R)
CALL CHKPNV ;Are we a PNV?
RETSKP ;No, go back now
JRST %DTYPE ;Otherwise do it
$IDEF: FIELD(COMDTY,R)
CALL CHKTVT ;Are we a TVT?
RETSKP ;No, go back now
JRST %DTYPE ;And go do it
$LDEF: FIELD(COMDTY,R)
CALL CHKDIA ;Are we a dialin?
IFNSK. ;No...
CALL CHKPNV ;An ether tty?
ANNSK.
CALL CHKTVT ;An internet tty?
ANNSK.
CALL CHKPTY ;Are we a PTY?
ANNSK.
ELSE.
RETSKP ;If any of these go back now
ENDIF.
JRST %DTYPE ;Otherwise go do the defaulting
$NDEF: FIELD(COMDTY,R)
CALL CHKPNV ;Are we an ether tty?
SKIPA
JRST %DTYPE ;If so
CALL CHKTVT ;Are we an internet TVT?
RETSKP ;No, neither so don't do default
JRST %DTYPE ;Otherwise go ahead and do it
$PDEF: FIELD(COMDTY,R)
CALL CHKPTY ;Are we a PTY?
RETSKP ;No, go back now
JRST %DTYPE ;Else go do it
CHKDIA: SAVEAC <B> ;Check if we're a dialin
MOVEI A,.PRIOU ;For our tty
MOVEI B,.MORSP ;See whether we're a dialin
MTOPR% ;Try to find out
TXNN B,MO%RMT ;Are we a dialin?
RET ;No, go back now +1
RETSKP ;Yes, go back +2
CHKPNV: MOVE A,FSTPNV ;Get first PNV number
CAMLE A,OURLIN ;Is it .GT. our tty?
RET ;Yes, go back +1
ADD A,NUMPNV ;Adjust for max PNV+1
CAMG A,OURLIN ;Is it .LE. our tty?
RET ;Yes, go back +1
RETSKP ;Else go back +2
CHKTVT: MOVE A,FSTTVT ;Get first TVT number
CAMLE A,OURLIN ;Is it .GT. our tty?
RET ;Yes, go back +1
ADD A,NUMTVT ;Adjust for max TVT+1
CAMG A,OURLIN ;Is it .LE. our tty?
RET ;Yes, go back +1
RETSKP ;Go back +2
CHKPTY: MOVE A,FSTPTY ;Get first PTY number
CAMLE A,OURLIN ;Is it .GT. our tty?
RET ;Yes, go back +1
ADD A,NUMPTY ;Adjust for max PTY+1
CAMG A,OURLIN ;Is it .LE. our tty?
RET ;Yes, go back +1
RETSKP ;Yes we are a PTY, go back +2
$DTYPE: FIELD(COMDTY,R)
%DTYPE: HRRZ B,(B)
CHECK DTYPE,DEFAULT-TYPE
MOVEM B,DTYPE
JRST CRET
SETTYP: CHECK TYPE,TYPE
MOVEM B,TYPE
JRST CRET
$EXIT: SKIPE FILEF
JRST [ SETZM EXITS
RETSKP]
CHECK EXITF,EXIT
SETZM EXITF
RETSKP
%FLAG: TDZA A,A
$FLAG: MOVEI A,1
CHECK FLAGF,FLAG
MOVEM A,FLAGF
JRST CRET
%FORM: TDZA A,A
$FORM: MOVEI A,1
CHECK FORMF,FORMFEED
MOVEM A,FORMF
JRST CRET
$HELP: SKIPE FILEF
JRST [ SETZM HELPS
RETSKP]
CHECK HELPF,HELP
SETZM HELPF
RETSKP
$LENGT: CHECK LENGTH,LENGTH
FIELD(COMNUM,R)
MOVEM B,LENGTH
JRST CRET
%LOWER: TDZA A,A
$LOWER: MOVEI A,1
CHECK LOWERF,LOWERCASE
MOVEM A,LOWERF
JRST CRET
$100AN: TDZA A,A
$10052: MOVEI A,1
SKIPL VT100F
JRST [ SKIPE FILEF
RETSKP
TMSG <?Cannot give VT100->
HRROI A,[ASCIZ /ANSI/]
SKIPE VT100F
HRROI A,[ASCIZ /52/]
PSOUT
TMSG < more than once
>
RET]
MOVEM A,VT100F
JRST CRET
%PGSPD: CHECK SPEED,NO-PAGE-SPEED
FIELD(COMSPD,R) ;GET SPEED
HRRZ B,(B) ;GET VALUE
MOVEM B,SPEED ;AND SAVE HERE
JRST CRET
%PAUSE: TDZA A,A
$PAUSE: MOVEI A,1
CHECK PAUSEF,PAUSE-AT-END-OF-PAGE
MOVEM A,PAUSEF
JRST CRET ;NO, DONE
%CTLS: TDZE A,A
$CTLS: MOVEI A,1
CHECK CTLSF,PAUSE-ON-COMMAND
MOVEM A,CTLSF
JRST CRET
%REFSY: TDZE A,A
$REFSY: MOVEI A,1
CHECK REFSYS,REFUSE-MESSAGES
MOVEM A,REFSYS
JRST CRET
IFN LOTSW!GSBSW,<
$OPERA: MOVEI A,1 ;OPERATOR permitted to login on this tty
CHECK OPERA,OPERATOR
MOVEM A,OPERA
JRST CRET
>;IFN LOTSW!GSBSW
%RAISE: TDZA A,A
$RAISE: MOVEI A,1
CHECK RAISEF,RAISE
MOVEM A,RAISEF
JRST CRET
%TAB: TDZA A,A
$TAB: MOVEI A,1
CHECK TABF,TAB
MOVEM A,TABF
JRST CRET
$WIDTH: CHECK WIDTH,WIDTH
FIELD(COMNUM,R)
MOVEM B,WIDTH
JRST CRET
$FULL: MOVEI A,.TTFDX
JRST DODUM
$HALF: MOVEI A,.TTHDX
JRST DODUM
$LHALF: MOVEI A,.TTLDX
DODUM: CHECK LINEF,DUPLEX
MOVEM A,LINEF
JRST CRET
%FILE: SETZ A,
JRST GFILE
$FILE: MOVE A,[FILBLK,,CMGJFN]
BLT A,CMGJFN+FILLEN-1
FIELD(COMFIL,R)
MOVE A,B
GFILE: CHECK FJFN,FILE
MOVEM A,FJFN
CRET: AOS CHANGE
RETSKP
COMQST: FLDDB. .CMQST
$ADDRE: CHECK ADDRE,ADDRESS
FIELD(COMQST,R)
HRROI A,ADDRE
HRROI B,ABBUF
MOVEI C,5*6-1 ;UP TO 34 CHARACTERS
SETZB D,ADDRE ;CLEAR LOW BIT, SINCE BUGGY MONITOR DOESN'T
SOUT ;COPY THE STRING
IDPB D,A ;ENSURE A NULL TERMINATED STRING
JRST CRET
;HERE ON /PRINT-NODE: TO SET THE USER'S DECNET NODE
$PRINT: CHECK PRINT,PRINT-NODE
FIELD (COMQST,R)
HRROI A,PRINT
HRROI B,ABBUF
MOVEI C,6 ;UP TO 6 CHARACTERS IN A NODE NAME
SETZB D,PRINT ;END ON A NULL, CLEAR DATA AREA
SETZM PRINT+1 ;CLEAR SECOND WORD OF DATA AREA
SOUT ;COPY THE STRING
JRST CRET
IFN LOTSW!GSBSW,<
$ASSIG: MOVEI A,1
CHECK ASSIG,ASSIGNABLE
MOVEM A,ASSIG
JRST CRET
$OVERH: MOVEI A,1
CHECK OVERH,OVERHEAD
MOVEM A,OVERH
JRST CRET
$CONSU: MOVEI A,1
CHECK CONSU,CONSULTANT
MOVEM A,CONSU
JRST CRET
$EXPRE: MOVEI A,1
CHECK EXPRE,EXPRESSTERMINAL
MOVEM A,EXPRE
JRST CRET
>;IFN LOTSW!GSBSW
LOCKEY: FLDDB. (.CMKEY,,LOCTAB,,,COMNUM) ;KEYWORD OR A NUMBER
$LOCAT: CHECK LOCAT,LOCATION
FIELD(LOCKEY)
HRRZ C,C ;GET FIELD ACTUALLY PARSED
CAIN C,LOCKEY ;DID WE PARSE A KEYWORD?
HRRZ B,(B) ;YES. IF NOT, NUMBER IS ALREADY IN B.
MOVEM B,LOCAT
JRST CRET
IFN LOTSW!GSBSW,<
LOCTAB: TABLE ;SUGGESTED NAMES FOR VALUES
T ARPANVT,11 ;LOCARP
T CERASLOBBY,2 ;LOCLOB
T CERASOTHER,3 ;LOCCOT
T DECNVT,12 ;LOCDEC
T DIALIN,6 ;LOCDIA
T ERL206,14 ;LOCERL
T ETHERNVT,10 ;LOCETH
T GANDALF,7 ;LOCGAN
T INTERNETNVT,15 ;LOCINT
T LARKIN,20 ;LOCLAR
T MEYER,16 ;LOCMYR
T OFFICE,1 ;LOCOFF
T PTY,13 ;LOCPTY
T TERMAN104,4 ;LOCTER
T TERMANLOBBY,17 ;LOCTLB
T TERMANOTHER,5 ;LOCTOT
T UNKNOWN,0 ;LOCUNK
TEND
>;IFN LOTSW!GSBSW
IFE LOTSW!GSBSW,<
LOCTAB: TABLE ;SUGGESTED NAMES FOR VALUES
T UNKNOWN,0 ;LOCUNK
TEND
>;IFE LOTSW!GSBSW
IFN LOTSW!GSBSW,<
$TOBAC: MOVEI D,5
JRST DIRECT
$TODIA: SKIPA D,[4]
$TOFRO: MOVEI D,3
JRST DIRECT
$TOGLA: SKIPA D,[2]
$TOLEF: MOVEI D,0
JRST DIRECT
$TOPAR: SKIPA D,[6]
$TORIG: MOVEI D,1
DIRECT: CHECK(DIRARR(D),<neighbor specification>)
FIELD(COMTRM,DIRERR) ; Parse a keyword (host name) or octal terminal
; number.
ACVAR HSTADR
HRRZ C,C ; Get the FDB address
CAIE C,COMHST ; Was it a host name?
IFSKP. ; Yes.
HRROI A,ABBUF ;Pointer to the host name
MOVX B,PN%NAM!PN%FLD!<2,,HSTADR> ;Where to put the data
PUSH P,D ;Save from certain doom...
PUPNM% ;Get the host number
IFJER.
ADJSP P,-1 ;Flush pushed arg
JRST DIRERR ;We had a mistake, oh well
ENDIF.
POP P,D ;Restore this reg
FIELD(COMPLS,DIRERR) ;Get a plus
FIELD(COMOCT,DIRERR) ;Get the octal number following
HLRZ A,HSTADR ;Get the net number
HRRZS HSTADR ;And isolate the host number
ELSE.
MOVE A,NETNUM ; Get net and host.
MOVE HSTADR,HSTNUM
ENDIF.
HRL B,HSTADR ; Get host number and...
LSH A,↑D27 ; ...fold in net number.
IOR B,A
MOVEM B,DIRARR(D)
ENDAV.
JRST CRET
DIRERR: TMSG <?Error in /NEIGHBOR argument: >
HRROI A,CMBUF
PSOUT%
TMSG <
?Parsing terminated for this file>
; JRST CNTCON ; Just stare at the wall.
>;IFN LOTSW!GSBSW
; Routine to halt, then type "?Can't continue" when continued.
CNTCON: DO.
HALTF%
TMSG <?Can't continue>
LOOP.
ENDDO.
SUBTTL COMMAND EXECUTION
COMDON: HRROI A,HLPMES
SKIPL HELPF
PSOUT
SKIPG CHANGE
JRST COMEND
SETOM FILEF ; Now reading file.
CALL SETTTY ; Set the network for this terminal.
FILCHK: MOVE A,TYPE ;SEE IF NEED CHECK NOW
CAIN A,-1
JRST [ CALL DOCHK
SKIPL TYPE ;STILL UNKNOWN?
JRST COMXCT ;NOPE, NO FILE PLEASE
JRST CKFILE]
CKFILE: SKIPLE A,FJFN
JRST FILGOT
JUMPE A,COMXCT ;DONE IF EXPLICIT NOFILE
SKIPGE TYPE ;DEFAULT SEARCH ONLY IF NO TYPE
SKIPL FILEF ;TRIED YET?
JRST COMXCT ;YES, NO MORE
MOVEI A,1
MOVEM A,FILEF ;FLAG TRYING DEFAULT FILE
SKIPN BINFLG ;DON'T IF WRITING A BINARY FILE!
CALL GETBIN ;TRY TO GET THE DATA FROM TTYINI.NET-BIN
SKIPN BINFLG ;FAILED, DON'T WORRY IF NOT CREATING BIN FILE
JRST COMXCT ;SUCCESS. GO DO IT.
MOVX A,GJ%OLD!GJ%SHT
HRROI B,[ASCIZ /SYSTEM:TTYINI.NET-CMD/]
GTJFN
JRST [ JSMSG(<Can't get SYSTEM:TTYINI.NET-CMD:>,%)
JRST COMXCT]
FILGOT: HRRZM A,IJFN
MOVX B,FLD(7,OF%BSZ)!OF%RD
OPENF
JRST [ TMSG <
?Can't open >
MOVEI A,.PRIOU
MOVE B,IJFN
SETZ C,
JFNS
ERCAL R
TMSG < because: >
CALL JSMSG0
JRST COMLOP]
SETOM FJFN
MOVE A,[DATBEG,,TMPARG] ;SAVE USER ARGS
BLT A,TMPARG+DATALN-1
FILLOP: HRROI A,CMBUF
MOVEI B,.NULIO
HRL B,IJFN
CALL DOINI
CALL CLEAN ;CLEAN UP LAST SCAN
SETOM EXITS
SETOM HELPS
MOVE A,[TMPARG,,DATBEG]
BLT A,DATEND-1
FIELD(COMLIN,FILERR) ;Else parse them as octal
HRRZ C,C
CAIN C,COMSTR
JRST ISOURS ;* ALWAYS MATCHES
CAIE C,CMDKEY ; Keyword?
IFSKP.
HRRZ B,(B) ; Yes, get the dispatch address.
JRST (B)
ENDIF.
CAIE C,COMOCT
JRST FILLOP ;IGNORE BLANK LINES
SKIPL HSTNUM ; Have we not seen a host yet?
IFSKP. ; Yes, then we can't associate this with a host
TMSG <
?Terminal line encountered without previous HOST line:
>
HRROI A,CMBUF
PSOUT%
TMSG <
?Aborting parse of file>
JRST CNTCON
ENDIF.
MOVE A,NETNUM ; Fold in net, host information for this line.
LSH A,↑D27
IOR B,A
HRL A,HSTNUM
IOR B,A
SKIPE BINFLG ;SKIP IF NOT CREATING A BINARY FILE
JRST BINLIN ;WRITE A LINE IN THE BINARY FILE
CAMN B,OURLIN ;FIND OUR LINE?
JRST ISOURS ;YES
jrst filer1 ;no. Not ours
FILERR: MOVEI A,.FHSLF
GETER
HRRZ B,B
CAIN B,COMNX9 ;EOF?
JRST FILNON ;YES, NONE FOUND
FILER1: FIELD(COMEOL,FILLOP) ;EAT LINE
JRST FILLOP
;SETTTY - set network address for a terminal.
;Call:
;Ret: OURLIN set to net, host and line number.
;Blasts A-D.
SETTTY: ACVAR <TIPADR,TIPLIN> ; If TIPADR is zero, says use local net
; address, else has net address for TIP.
; TIPLIN is the line number on the TIP.
MOVNI A,1 ; Get TTY number we're on.
MOVE B,[1,,C]
MOVEI C,.JITNO
GETJI%
JSHLT
MOVEM C,OURLIN ; Stash this.
MOVE B,FSTPNV ; Check if we're on a PNV.
ADD B,NUMPNV
SETZM TIPADR ; If zero, says set local net/host, else has
; TIP net address.
CAML C,FSTPNV ; In range?
CAML C,B
IFSKP. ; Yes, we are on a PNV. Are we on a TIP?
MOVE A,['NVTPUP'] ; Get table numbers for some tables.
SYSGT%
MOVE A,C ; Get index into NVTPUP table.
SUB A,FSTPNV
HRLS A
HRR A,B
GETAB% ; Get the entry from NVTPUP for this NVT.
JSHLT ; Some random error.
HRLZ C,A ; Save the port number.
MOVE A,['PUPFPT'] ; Get number of foreign port table.
SYSGT%
MOVE A,C ; Get back port number.
HRR A,B ; Get table number for PUPFPT.
GETAB% ; Get the foreign port address information.
JSHLT
HRRZ D,A ; Save the port address, flush the count.
HRR A,PARNUM ; Get the monitor address of PUPBUF.
HRLI A,1 ; (Index 1 in PUPPAR).
GETAB%
JSHLT
SUB D,A ; Get index into PUPBUF
MOVE A,['PUPBUF'] ; Get number of PUPBUF table
SYSGT%
HRLI A,1(D) ; Index to net address for this foreign port
HRLI B,2(D) ; Index to second word of net address.
HRR A,B ; Get PUPBUF table number
GETAB% ; Get first word of net address
JSHLT
MOVEM A,TIPADR ; Save it.
MOVEM A,TEMP ; Set up for PUPNM%.
SETZM TEMP+1 ; Flush socket information.
MOVE A,B ; Get the socket information.
GETAB%
JSHLT
ANDI A,77 ; Flush most of the junk, just want the line.
MOVEM A,TIPLIN ; Save it.
HRROI A,TEMP ; Put ASCIZ address there
MOVX B,PN%FLD!TEMP
PUPNM%
IFNJE. ; Then look if this is a tip...
MOVE B,TEMP
TLZ B,201004 ; Uppercase first three letters
CAML B,[ASCIZ/TIP-/] ; Is it?
CAML B,[ASCIZ/TIP./]
SETZM TIPLIN ; No, indicate to use local net/host.
ELSE.
SETZM TIPLIN
ENDIF.
ENDIF.
IFE. TIPADR ; If 0, then set local net/host information.
MOVE A,LCLNET ; Merge in net and host information for this
LSH A,↑D27 ; line.
IORM A,OURLIN
HRL A,LCLHST
IORM A,OURLIN
ELSE. ; We're on a TIP, set the net and host for it.
HRRM TIPLIN,OURLIN ; Set the line.
HRLM TIPADR,OURLIN ; Drop in the host number.
MOVSS TIPADR ; Get the net number in the right half.
DPB TIPADR,[POINT 9,OURLIN,8] ; Drop in the net number.
ENDIF.
ENDAV.
RET
;$HOST - handle HOST keyword in command file.
$HOST: FIELD(COMHST,HSTERR) ; Get a host name.
HRROI A,ABBUF ;Pointer to the atom buffer
MOVX B,PN%NAM!PN%FLD!<4,,TEMP> ;Allow room enough for multiple hosts
PUPNM% ;Do it
IFJER.
TMSG <
?Couldn't get information on host >
HRROI A,ABBUF ;Find out who smashed us
PSOUT%
TMSG <, aborting>
JRST CNTCON ;Shut down permanently
ENDIF.
HLRZS B ; Get pointer to data for host.
SUBI B,2 ;Find out how many entires we have
IFN. B ;If we have more than one entry...
HLRZ A,TEMP+2 ;Get the net number of the pointer
SKIPN BINFLG ;Making a binary file?
IFSKP. ;Yes...
CALL NETDO ;Do net munging
ELSE.
MOVEM A,NETNUM ;Else just stash it
ENDIF.
HRRZ B,TEMP+2 ;Get the host number to set the pointer into
MOVE A,TEMP ;Get to where we wish to point
MOVEM A,NETPGA(B) ;Stash it
ENDIF.
HLRZ A,TEMP ; Get the net number.
SKIPN BINFLG ; Making a binary file?
IFSKP. ; Yes.
CALL NETDO ; Do net munging.
ELSE.
MOVEM A,NETNUM ; No, just stash net number.
ENDIF.
HRRZ A,TEMP ; Get the host number.
SKIPN BINFLG
IFSKP.
CALL HOSTDO ; Do host munging.
ELSE.
MOVEM A,HSTNUM ; Just stash host number if no binary file.
ENDIF.
JRST FILLOP ; Finished here.
HSTERR: TMSG <?Invalid host name in file: >
HRROI A,CMBUF
PSOUT%
TMSG <?Aborting parse of file.>
JRST CNTCON
;NETDO - Create or map a network's NET page.
;Call: A/ Net number of net to munge.
;Ret: +1 - Network's NET page in NETPAG.
NETDO: SAVEAC B
ACVAR NET
MOVE NET,A
CAMN NET,NETNUM ; Is this the net we have in memory?
IFSKP. ; No. Must set things up.
SKIPG NETNUM ; Do we have a net in memory?
IFSKP. ; Yes, unmap the old page.
SETOM A
MOVE B,[.FHSLF,,NETPAG]
SETZM C
PMAP%
ENDIF.
MOVEM NET,NETNUM ; Set this as the new net in memory.
MOVE B,FILPAG ; Get the page number of the second host page.
AOS B ; ...
MOVE C,NUMTTY+HSTPGA ; Get number of TTYs.
IMUL C,BLKSIZ+TTYPGA ; Get number of words of TTYINI information.
AOS C ; Count NUMTTY.
LSH C,-↑D9 ; Make pages.
IFN. C ; If there are any map them out.
ADDM C,FILPAG ; Update this information.
MOVE A,[.FHSLF,,HSTPAG+1] ; Create some new pages in the file.
HRL B,NETJFN ; Create argument for PMAP%.
TXO C,PM%RD!PM%WR!PM%CNT
PMAP% ; Create the pages.
ENDIF.
SETOM A ; Unmap the host page, too.
MOVE B,[.FHSLF,,HSTPAG]
SETZM C
PMAP%
SETZM HSTNUM ;Clear current host - don't unmap twice!
SKIPL A,NETADR+TTYPGA(NET) ; Is there a page allocated for this net?
IFSKP. ; No ...
SETOM NETPGA ; Create a page of bits.
MOVE A,[NETPGA,,NETPGA+1]
BLT A,NETPGA+777
MOVE A,[.FHSLF,,NETPAG] ; Make a new page in the file.
AOS B,FILPAG ; Get a new page number.
MOVEM B,NETADR+TTYPGA(NET) ; Set it in the index page.
MOVEM B,MAPNET ; Make it the mapped net.
HRL B,NETJFN
MOVX C,PM%WR!PM%RD
PMAP%
EXCH A,B ; Map it back.
TXO C,PM%PLD
PMAP%
ENDIF.
HRL A,NETJFN ; Move in file's JFN.
MOVE B,[.FHSLF,,NETPAG] ; Map it there.
MOVX C,PM%RD!PM%PLD!PM%WR
PMAP%
ENDIF.
ENDAV.
RET
;HOSTDO - Create a host's data area.
;Call: A/ Host number to munge.
;Ret: +1 - Host's data page initialized in HSTPAG.
HOSTDO: ACVAR HOSTN
MOVE HOSTN,A
SKIPG A,HSTNUM ; Do we have a host right now?
IFSKP. ; Yes...
MOVE B,FILPAG ; Get the page number of the second host page.
AOS B ; ...
MOVE C,NUMTTY+HSTPGA ; Get number of TTYs.
IMUL C,BLKSIZ+TTYPGA ; Get number of words of TTYINI information.
AOS C ; Count NUMTTY.
LSH C,-↑D9 ; Make pages.
IFN. C ; If there are any map them out.
ADDM C,FILPAG ; Update this information.
MOVE A,[.FHSLF,,HSTPAG+1] ; Create some new pages in the file.
HRL B,NETJFN ; Create argument for PMAP%.
TXO C,PM%RD!PM%WR!PM%CNT
PMAP% ; Create the pages.
ENDIF.
SETOM A ; Unmap the host page, too.
MOVE B,[.FHSLF,,HSTPAG]
SETZM C
PMAP%
ENDIF.
MOVEM HOSTN,HSTNUM ; Update this.
SKIPG A,NETPGA(HOSTN) ; Is there already an entry for this host?
IFSKP.
TMSG <?Duplicate host encountered in TTYINI.NET-CMD file: >
HRROI A,CMBUF
PSOUT%
TMSG <
?Aborting parse of file>
JRST CNTCON
ELSE. ; Generating file, and page doesn't exist.
SETZM NUMTTY+HSTPGA ; No TTYs seen so far.
SETOM TTYBLK+HSTPGA ; Set the rest of the bits in the page.
MOVE A,[TTYBLK+HSTPGA,,TTYBLK+HSTPGA+1]
BLT A,TTYBLK+HSTPGA+10776
MOVE A,[.FHSLF,,HSTPAG] ; Create the page in the file.
AOS B,FILPAG
MOVEM B,NETPGA(HOSTN) ; Update this pointer.
MOVEM B,MAPHST ; Make this the mapped host.
HRL B,NETJFN
MOVX C,PM%WR!PM%RD
PMAP%
EXCH A,B ; Map it right back in.
TXO C,PM%PLD
PMAP%
ENDIF.
ENDAV.
RET
ISOURS: FIELD(COMAND,TRMERR)
HRRZ B,(B)
MOVE A,B
HRRZ C,C
CAIN C,COMAND
JRST FILDON ;CONFIRMED
CAIN C,COMTYP
MOVEI A,SETTYP
CALL (A)
JRST TRMERR
JRST ISOURS
TRMERR: JSMSG <Command error in file>
TMSG <Line was: >
HRROI A,CMBUF
PSOUT
TMSG <
Will ignore terminal data line and continue scan
>
JRST FILERR
FILNON: MOVE A,[TMPARG,,DATBEG]
BLT A,DATEND-1
JRST FILDN1
FILDON: HRROI A,[ASCIZ \%Ignoring /EXIT from file
\]
SKIPL EXITS
PSOUT
HRROI A,[ASCIZ \%Ignoring /HELP from file
\]
SKIPL HELPS
PSOUT
FILDN1: SKIPE BINFLG ;SKIP IF NOT CREATING A BINARY FILE
CALL MAKBIN ;WRITE OUT THE BINARY FILE
MOVE A,IJFN
CLOSF
JCERR <CLOSF failed>
JRST FILCHK
COMXCT: SKIPL B,TYPE
JRST DOSTYP
SKIPGE B,DTYPE ;DEFAULT?
JRST NOSTYP
MOVEM B,TYPE ;YES, SET AS TYPE
CAIN B,-1
CALL DOCHK
SKIPGE B,TYPE
JRST NOSTYP
DOSTYP: tlc b,377777 ; if type=377777,,typeno then treat
tlze b,377777 ; as type num. instead of routine addr
CALL (B)
MOVEI A,.CTTRM
STTYP
JCERR <STTYP failed>
CAIE B,.TTTEL ;TELERAYS RUN THE TELERAY PROGRAM FOR FREE HERE
JRST NOSTYP ; TO SET UP THEIR TABS
MOVX A,CR%CAP
CFORK
JRST NOSTYP
MOVEI D,(A)
MOVX A,GJ%OLD!GJ%SHT
HRROI B,[ASCIZ/SYS:TELERAY.EXE/]
GTJFN
JRST NOSTYP
HRLI A,(D)
GET
MOVEI A,(D)
SETZ B,
SFRKV
WFORK
KFORK
NOSTYP: MOVEI A,.CTTRM
RFMOD
SKIPN LOWERF
TXZ B,TT%LCA
SKIPLE LOWERF
TXO B,TT%LCA
SKIPN FORMF
TXZ B,TT%MFF
SKIPLE FORMF
TXO B,TT%MFF
SKIPN TABF
TXZ B,TT%TAB
SKIPLE TABF
TXO B,TT%TAB
SKIPN FLAGF
TXZ B,TT%UOC
SKIPLE FLAGF
TXO B,TT%UOC
SKIPN RAISEF
TXZ B,TT%LIC
SKIPLE RAISEF
TXO B,TT%LIC
SKIPL C,LINEF
STOR C,TT%DUM,B
SKIPN PAUSEF ;FIRST, USE PAUSE-AT-END-OF-PAGE
TXZ B,TT%PGM
SKIPLE PAUSEF
TXO B,TT%PGM
SKIPN CTLSF ;USE PAUSE-ON-COMMAND IF ANY
TXZ B,TT%PGM
SKIPLE CTLSF
TXO B,TT%PGM
STPAR
JCERR <STPAR failed>
SKIPGE C,LENGTH
JRST NOLEN
MOVEI A,.CTTRM
MOVEI B,.MOSLL
MTOPR
JCERR <Length MTOPR failed>
NOLEN: SKIPGE C,WIDTH
JRST NOWID
MOVEI A,.CTTRM
MOVEI B,.MOSLW
MTOPR
JCERR <Width MTOPR failed>
NOWID: SKIPGE C,REFSYS ;BY DEFAULT, USE SYSTEM DEFAULT
JRST NOREF
MOVEI A,.CTTRM
MOVEI B,.MOSNT ;N.B. THIS CODE DEPENDS ON .MOSMY=0
TRC C,1 ; AND .MOSMN=1
MTOPR
JCERR <Refuse Messages MTOPR failed>
NOREF: MOVE A,PRINT ;FETCH FIRST WORD OF NODE NAME
CAMN A,[-1] ;-1 MEANS NOTHING SET
JRST NOSTJB ;SO SKIP THIS
SETO A, ;-1 FOR THIS JOB
MOVX B,.SJLLO ;FUNCTION IS SET JOB LOCATION
HRROI C,PRINT ;POINTER TO NODE NAME
SETJB% ;SET IT
JCERR <Unable to set job location>
NOSTJB: SKIPGE PAUSEF
JRST NOXOF
MOVEI A,.CTTRM
MOVEI B,.MOXOF
MOVEI C,.MOONX
SKIPN PAUSEF
MOVEI C,.MOOFF
MTOPR
JCERR <Pause MTOPR failed>
NOXOF: SKIPGE SPEED ;SPEED TO CUT-OFF AT SPECIFIED?
JRST COMEND
MOVEI A,.CTTRM
MOVEI B,.MORSP
MTOPR
ERJMP [JSMSG <Failed to read speed for controlling terminal>
JRST COMEND]
CAMN C,[-1]
JRST COMEND
HRRZ C,C ;GET OUTPUT SPEED
CAMLE C,SPEED ;SPECIFIED SPEED LESS THAN ACTUAL?
JRST COMEND ;YES, LEAVE PAGE MODE ON
MOVEI A,.CTTRM
MOVEI B,.MOXOF
MOVEI C,.MOOFF
MTOPR
JCERR <Failed to set /NO-PAUSE-AT-END-OF-PAGE>
JRST COMEND
XLIST
HLPMES: ASCIZ \
TTYINI is a program to set terminal types. Normally it reads the
necessary information from the file SYSTEM:TTYINI.NET-BIN. You may
selectively override any or all of the values contained in the file.
The command format is an optional terminal type name followed by
optional switches.
Available terminal type names:
33 Model 33 hardcopy terminal.
35 Model 35 hardcopy terminal.
37 Model 37 hardcopy terminal.
43 Model 43 hardcopy terminal.
ADM-3 LSI ADM-3 or other "glass teletype".
ALTO XEROX Alto running Datamedia 2500 emulation with 60 line screen
AMBASSADOR Ann Arbor Ambassador terminal.
ANN-ARBOR Ann Arbor terminal.
ANSI ANSI standard terminal
AVT Concept AVT terminal
CHECK Special type. When given, causes the terminal to be
polled to determine type. Currently works for VT50,
VT52, VK100 (GIGI), VT100, VT125, LA34 and LA120 terminals.
If the type is successfully determined, reading of any
file is suppressed. A VT100 can be in VT52 mode. This
case is indicated during the checking procedure.
DATAMEDIA-1520 Datamedia model 1520
DATAMEDIA-2500 Datamedia model 2500 or modified 3000 terminal.
DEFAULT System default terminal type.
DIABLO Diablo printer (sets to LA36)
DM1520 Same as DATAMEDIA-1520
DM2500 Same as DATAMEDIA-2500
ESPRIT Hazeltine Esprit
EXECUPORT Execuport terminal.
FR100 Same as Freedom-100
FR200 Same as Freedom-200
FREEDOM-100 Liberty Electronics Freedom-100
FREEDOM-200 Liberty Electronics Freedom-200
GIGI DEC VK100 graphics terminal
H19 Same as ZENITH.
HAZELTINE-1500 Hazeltine 1500 terminal.
HEATH-19 Same as ZENITH.
HP2645A HP 2645 or related terminal.
IBM-3101 IBM 3101 ASCII terminal
IDEAL Does no special character processing.
LA120 DEC LA120 terminal.
LA30 DEC LA30 terminal.
LA34 DEC LA34 terminal.
LA36 DEC LA36 terminal.
LA38 DEC LA38 terminal.
NVT "Network Virtual Terminal", equivalent to IDEAL.
SOROC-120 Soroc IQ120 terminal.
SUN SUN work station. A VT100 with a long screen.
TEK4023 Tektronix 4023 terminal.
TEK4025 Tektronix 4025 terminal.
TEKTRONIX-4023 Tektronix 4023 terminal.
TEKTRONIX-4025 Tektronix 4025 terminal.
TELEMEDIA Televideo with Datamedia emulation. Same as Datamedia-2500.
TELERAY-1061 Teleray 1061 terminal with edit key.
TELEVIDEO-912 Televideo 912 terminal.
TERMINET Terminet terminal. (worst possible)
VK100 DEC GIGI.
VT05 DEC VT05 video terminal.
VT100 DEC VT100 video terminal.
VT50 DEC VT50 video terminal.
VT52 DEC VT52 video terminal.
The following switches may be given:
/BINARY-FILE Instead of setting terminal parameters, read the
file SYSTEM:TTYINI.NET-CMD and write a new copy of
SYSTEM:TTYINI.NET-BIN. Various special switches may
be included in TTYINI.NET-CMD; see below.
/DEFAULT-TYPE:type-name
If terminal type not specified, use this type.
/DIALIN-DEFAULT:type-name
If terminal is a dialin then do same as /DEFAULT-TYPE.
/ETHERNET-DEFAULT:type-name
If terminal is an Ethernet terminal then do same as
/DEFAULT-TYPE.
/EXIT Exit at end of command.
/FILE:filespec Read "filespec" for terminal data by line number.
/FLAG Flag upper case output (precede by ').
/FORMFEED Send formfeed characters directly to terminal.
/FULLDUPLEX Set terminal to FULL DUPLEX mode.
/HALFDUPLEX Set terminal to CHARACTER HALF DUPLEX mode.
/HELP Print this text.
/INTERNET-DEFAULT:type-name
If terminal is an Internet terminal then do same as
/DEFAULT-TYPE.
/LENGTH:n Set terminal length (lines per page) to "n".
/LINE-HALFDUPLEX
Set terminal to LINE HALF DUPLEX mode.
/LOCAL-DEFAULT:type-name
If temrinal is a hardwired terminal then do same as
/DEFAULT-TYPE
/LOWERCASE Pass lower case characters to terminal.
/NOFILE Never read a file.
/NOFLAG Don't flag upper case output.
/NOFORMFEED Simulate formfeed characters.
/NOLOWERCASE Convert lower case to upper case on output.
/NO-PAGE-SPEED:n
The value "n" is the speed at or below which to
disable /PAUSE-ON-END-OF-PAGE. If the speed
of output from the computer to the terminal is
higher than the specified speed, the /PAUSE-ON-
END-OF-PAGE will be allowed either implicitly or
explicitly.
/NO-PAUSE-AT-END-OF-PAGE
Don't pause when end of page is reached.
/NO-PAUSE-ON-COMMAND
Don't pause when ↑S is typed.
/NORAISE Don't convert lower case to upper case on input.
/NOTAB Simulate tab characters.
/PAUSE-AT-END-OF-PAGE
Stop terminal output at end of page (when lines per
page lines have been output). Type ↑Q to cause output
to continue.
/PAUSE-ON-COMMAND
Stop terminal output when ↑S is typed. Type ↑Q to cause
output to continue.
/PTY-DEFAULT:type-name
If the terminal is a pseudo terminal then do the same
as /DEFAULT-TYPE.
/RAISE Convert lower case to upper case on input.
/REFUSE-MESSAGES Suppress the reception of system messages
/TAB Send tab characters directly to terminal.
/VT100-52 Used in conjuction with CHECK option. If terminal is
successfully identified as a VT100 in ANSI mode, it is
switched to VT100 in VT52 mode and that terminal type
is assumed.
/VT100-ANSI Used in conjuction with CHECK option. If terminal is
successfully identified as a VT100 in VT52 mode, it is
switched to VT100 in ANSI mode and that terminal type
is assumed.
/WIDTH:n Set terminal width to "n" characters.
If terminal type is not given and no /FILE:filespec or /NOFILE switches
are given, the file SYSTEM:TTYINI.NET-BIN is read.
The file SYSTEM:TTYINI.NET-CMD (read by the /BINARY-FILE command to build
SYSTEM:TTYINI.NET-BIN) contains information in text format for each line.
Each line of the file has the following format:
<line #> <same as TTYINI command line>
The <line #> indicates which line the command line applies to. The
file is parsed using the COMND JSYS. Several special switches are
only applicable inside of TTYINI.NET-CMD:
/ADDRESS:"quotedstring"
Use "quotedstring" as the location name known to the
FINGER program.
/ASSIGNABLE Assignable by the queueing system.
/CONSULTINGTERMINAL
Reserved for a LOTS consultant.
/EXPRESSTERMINAL
Reserved for short (5 min. or less) terminal sessions.
/LOCATION:location
Location of the terminal (currently one of ARPANVT,
CERAS105, CERASLOBBY, CERASOTHER, DECNVT, DIALIN,
ERL206, GANDALF, PTY, TERMAN104, TERMANOTHER, UNKNOWN).
/PRINT-NODE:"NODE"
Set the default print node for a job on this terminal
/OPERATOR Terminal can be used by the OPERATOR account.
/OVERHEAD Not subject to the normal 90 minute session time limit.
/TOBACK:n Terminal "n" is located "Behind you".
/TODIAGONAL:n Terminal "n" is located "Diagonally opposite you".
/TOFRONT:n Terminal "n" is located "Facing you".
/TOGLASS:n Terminal "n" is located "Across the glass from you".
/TOLEFT:n Terminal "n" is located "On your left".
/TOPARTITION:n Terminal "n" is located "Across the partition from you".
/TORIGHT:n Terminal "n" is located "On your right".
Examples:
TTYINI<cr>
Determine terminal data from SYSTEM:TTYINI.NET-BIN by line number.
TTYINI DATAMEDIA/WIDTH:84/LENGTH:38
Set terminal data explicity, this particular command would be
appropriate for a SUAI Datadisk terminal running DTN.
The following type names imply the indicated default switches
unless explicity overridden:
LA120 /NORAISE
LA34 LA120/NORAISE/NOFORMFEED/LOWERCASE
LA36 /NORAISE/LOWERCASE
LA38 /NORAISE/LOWERCASE
VK100 /NORAISE/PAUSE-AT-END-OF-PAGE/LOWERCASE
VT05 /RAISE/PAUSE-AT-END-OF-PAGE
VT50 /NORAISE/PAUSE-AT-END-OF-PAGE
VT52 /NORAISE/PAUSE-AT-END-OF-PAGE/LOWERCASE
VT100 /NORAISE/PAUSE-AT-END-OF-PAGE/LOWERCASE
VT125 /NORAISE/PAUSE-AT-END-OF-PAGE/LOWERCASE
\
LIST
SUBTTL CHECK HANDLER, TYPE ROUTINES
DOCHK: TMSG <[Terminal type is >
MOVEI A,.PRIOU
DOBE ;WAIT TILL OUT
CFIBF
RFMOD
MOVEM B,SAVMOD
TDZ B,[TT%ECO!TT%DAM]
SFMOD
DOBE
SETOM PASS ;FIRST PASS
HRROI A,[BYTE(7)33,132] ;QUERY FOR FIRST PASS
PASS2: PSOUT ;QUERY TERMINAL
MOVEI A,.PRIOU
DOBE
MOVEI C,↑D20 ;20 * 250 MS = 5 SECONDS
CHKLOP: SOJL C,CHKLOS
CALL GETCHR
JRST CHKLOP
CAIE A,33 ;CORRECT RESPONSE?
JRST CHKBAD ;NOT EVEN FIRST CHARACTER CORRECT
CALL GETCHR
JRST CHKLOS
CAIE A,"/" ;DEC terminal response?
JRST CKANSI ;NO, TRY ANSI RESPONSE
CALL GETCHR ;yes, get arg
JRST CHKLOS
CAIL A,"A"
CAILE A,"A"+DECMAX-1
JRST CHKLOS ;NOT IN DESIRED RANGE
SKIPN DECTAB-"A"(A)
JRST CHKLOS ;NO ENTRY FOR THIS ONE
MOVEI E,DECTAB-"A"(A)
CAIN E,T10052 ;IS THIS VT100 IN 52 MODE?
SKIPE VT100F ;YES, REQUESTING SWITCH TO 100 MODE?
CAIA ;NO, OK
JRST S100AN ;YES, SWITCH TO 100 MODE
MOVE D,DECTAB-"A"(A)
CHKOK: MOVEI A,.PRIIN
CFIBF
JRST CHKEND
S100AN: HRROI A,[BYTE(7)33,"<"] ;SET TO VT100-ANSI MODE
PSOUT
MOVE D,T100AN ;ASSUME OK, GET DISPATCH FOR VT100-ANSI
JRST CHKOK
CHKBAD: SETZM PASS ;IF BAD RESPONSE, NO SECOND-PASS
CHKLOS: MOVEI A,.PRIIN
CFIBF
AOSN PASS ;IS THIS FIRST PASS?
JRST [ HRROI A,[BYTE (7)33,133,"C"+40]
JRST PASS2] ;YES, TRY AGAIN WITH ANSI QUERY SEQ
MOVE D,[-1,,[ASCIZ /UNKNOWN]/]]
CHKEND: MOVE B,SAVMOD
SFMOD
HLREM D,TYPE
HRRZ A,D
PSOUT
RET
CKANSI: CAIE A,"["
JRST CHKLOS
MOVEI C,"?"
CALL CHKCHR
JRST CHKLOS
CALL GETCHR ; GET TYPE CODE
JRST CHKLOS
CAIL A,"1"
CAILE A,"0"+ANSIMX
JRST CHKLOS
MOVEI E,ANSITB-"1"(A)
CHKARG: CALL GETCHR
JRST CHKLOS
CAIE A,";"
JRST CHKANE
CALL GETCHR
JRST CHKLOS
CAIL A,"0"
CAILE A,"7"
JRST CHKLOS
JRST CHKARG
CHKANE: CAIE A,"C"+40
JRST CHKLOS
CAIN E,T100AN ;VT100 IN ANSI MODE?
SKIPG VT100F ;YES, REQUESTING SWITCH TO 52 MODE?
CAIA ;NO, GO AHEAD
JRST S10052 ;YES, DO IT
SKIPN D,(E) ;GET DISPATCH AND STRING (IF ANY)
JRST CHKLOS
JRST CHKOK
S10052: HRROI A,[BYTE(7)33,"[","?","2","L"+40] ;SET TO VT100-52 MODE
PSOUT
MOVE D,T10052 ;ASSUME OK, GET DISPATCH FOR VT100-52
JRST CHKOK
CHKCHR: CALL GETCHR
RET
CAMN C,A
RETSKP
RET
GETCHR: MOVEI A,.PRIIN
SIBE
JRST GETCH1
MOVEI A,↑D250
DISMS
MOVEI A,.PRIIN
SIBE
JRST GETCH1
RET
GETCH1: PBIN
ANDI A,177
RETSKP
$TT33: MOVEI B,.TT33
RET
$TT35: MOVEI B,.TT35
RET
$TT37: MOVEI B,.TT37
RET
$TT43: MOVEI B,.TT43
RET
$TTADM: MOVEI B,.TTADM
JRST VIDXIT
$TTALT: MOVEI B,.TTDAM
DEFAULT LENGTH,↑D60 ;DM2500 with big screen
JRST VIDXIT
$TTAMB: MOVEI B,.TTAMB
DEFAULT WIDTH,↑D79
DEFAULT LENGTH,↑D30
JRST VIDXIT
$TTANS: MOVEI B,.TTANS ;ANSI terminal type
JRST VIDXIT
$TTANN: MOVEI B,.TTANN
DEFAULT WIDTH,↑D80
JRST VIDXIT
$TTAVT: MOVEI B,.TTAVT
JRST VIDXIT
$TTCPT: MOVEI B,.TTCPT
JRST VIDXIT
$TTDAM: MOVEI B,.TTDAM
JRST VIDXIT
$TTDA2: MOVEI B,.TTDM2
JRST VIDXIT
$TTDEF: MOVEI B,.TTDEF
RET
$TTESP: MOVEI B,.TTESP
JRST VIDXIT
$TTEXE: MOVEI B,.TTEXE
RET
$TTGG: MOVEI B,.TTK10
JRST VIDXIT
$TTFR2: SKIPA B,[.TTFR2]
$TTFRD: MOVEI B,.TTFRD
JRST VIDXIT
$TTGIL: MOVEI B,.TTGIL
JRST VIDXIT
$TTHAZ: MOVEI B,.TTHAZ
JRST VIDXIT
$TTH19: MOVEI B,.TTH19
JRST VIDXIT
$TTHP: MOVEI B,.TTHP
JRST VIDXIT
$TTIBM: MOVEI B,.TTIBM
JRST VIDXIT
$TTDIA: MOVEI B,1
MOVEM B,REFSYS ;WANT TO SET REF SYS LATER ON
MOVEI B,.TTL36 ;PRETEND LA36 IS THE TTY TYPE
RET
$TTTI: MOVEI B,3
RET
$TTIDL: MOVEI B,.TTIDL
RET
$TTL30: MOVEI B,.TTL30
RET
$TTL34: MOVEI B,.TT120
DEFAULT FORMF,0
JRST LOWXIT
$TTL36: MOVEI B,.TTL36
JRST LOWXIT
$TTL38: MOVEI B,.TTL38
DEFAULT FORMF,0
JRST LOWXIT
$TTSRC: MOVEI B,.TTSRC
JRST VIDXIT
$TTSUN: MOVEI B,.TT100
DEFAULT LENGTH,↑D28 ;VT100 with a long screen
JRST VIDXIT
$TTTEK: MOVEI B,.TTTEK
DEFAULT LENGTH,↑D34
DEFAULT WIDTH,↑D78
JRST VIDXIT
$TTTK3: MOVEI B,.TTTK3
JRST VIDXIT
$TTTEL: MOVEI B,.TTTEL
JRST VIDXIT
$TTTVI: MOVEI B,.TTTVI
JRST VIDXIT
$TTTRM: MOVEI B,.TTDEF
RET
$TTV05: MOVEI B,.TTV05
DEFAULT RAISEF,1
RET
$TTV50: MOVEI B,.TTV50
DEFAULT PAUSEF,1
RET
$TT120: MOVEI B,.TT120
DEFAULT RAISEF,0
RET
$TT125: MOVEI B,.TT125
JRST VIDXIT
$TT100:
IFDEF .TT100,<
SKIPA B,[.TT100]
>;IFDEF .TT100
$TTV52: MOVEI B,.TTV52
VIDXIT: DEFAULT PAUSEF,1
LOWXIT: DEFAULT RAISEF,0
DEFAULT LOWERF,1
RET
;BINRD -- process binary data mapped in.
;call: a/ base of data block for our terminal
;ret: +1 always, with various data for TTYINI set
BINRD: SKIPLE B,B%TTYTYPE(A)
JRST [ HRLI B,377777 ;use special flag for LH
SKIPGE TYPE ;DON'T CHANGE IF ALREADY SET
MOVEM B,TYPE ;SET TYPE IF KNOWN
JRST .+1 ]
SKIPLE B,B%DEFTTYTYPE(A)
JRST [ HRLI B,377777 ;indicate actual type # rather than routine
SKIPGE DTYPE ;DON'T CHANGE IF ALREADY SET
MOVEM B,DTYPE ;SET /DEFAULT: IF KNOWN
JRST .+1 ]
SKIPG B,LENGTH ;USE EXISTING VALUE IF ANY
SKIPL B,B%LENGTH(A)
MOVEM B,LENGTH ;SET /WIDTH:
SKIPG B,WIDTH
SKIPL B,B%WIDTH(A)
MOVEM B,WIDTH ;SET /LENGTH:
SKIPG B,LINEF ;USE EXISTING VALUE IF ANY
SKIPL B,B%DPLXMODE(A)
MOVEM B,LINEF ;SET DUPLEX MODE
;SET PRINT NODE
DMOVE B,PRINT ;GET PRINT NODE (TWO WORDS)
CAME B,[-1] ;ANYTHING SET?
JRST BINRD0 ;SOMETHING ALREADY THERE, SKIP TO THE BITS
DMOVE B,B%PRINT(A) ;FETCH DEFAULT
CAMN B,[-1] ;DO WE KNOW ANYTHING?
DMOVE B,[ASCIZ/LOCAL/] ;NO, SO USE LOCAL:: AS OUR NODE NAME
DMOVEM B,PRINT ;SET THE NODE NAME UP
BINRD0: MOVE B,B%BITS(A) ;GET TABLE OF BITS (N.B. WE USE ONLY
;FIRST WORD!)
HRLZI C,-BINRLN ;GET NUMBER OF BITS WE'RE CHECKING.
BINRD1: MOVEI D,1 ;GET A "TRUE" VALUE
TDNN B,BINRTB(C) ;IS THIS BIT SET?
MOVEI D,0 ;NO, USE FALSE
SKIPGE @BINRTL(C) ;USE EXISTING VALUE IF ANY
MOVEM D,@BINRTL(C)
AOBJN C,BINRD1
RET ;ALL DONE
BINRTB: B%FORMFEED
B%LOWERCASE
B%TABS
B%PAGEPAUSE
B%COMMANDPAUSE
B%RAISE
B%FLAG
BINRLN==.-BINRTB
BINRTL: IFIW!FORMF
IFIW!LOWERF
IFIW!TABF
IFIW!PAUSEF
IFIW!CTLSF
IFIW!RAISEF
IFIW!FLAGF
IFN <.-BINRTL>-BINRLN,<PRINTX %WARNING. BINRTB & BINRTL TABLES NOT SAME LENGTH
>
SUBTTL Binary file reading
;BINLOC -- find location of data block for terminal.
;Call: With TTYINI page 0 mapped at TTYPAG and NETJFN open on file.
; MAPNET -1 if no NET page mapped, else NET page index of mapped NET page
; A/ set up with our line number (net, host, line number)
;Ret: +1 - Terminal is not in file
; +2 - Success, with
; A/ Pointer to terminal data block in memory.
BINLOC: ACVAR LINNUM
MOVE LINNUM,A
LDB A,[POINT 9,LINNUM,8] ; Get the network number for NETMAP.
CALL NETMAP ; Map the net page for this terminal.
RET ; No NET page for this terminal, return bad.
LDB A,[POINT 9,LINNUM,17] ; Get the host number for HSTMAP.
CALL HSTMAP ; Map the HOST's TTYINI data, if it exists.
RET ; It doesn't.
HRRZ A,LINNUM ; Make this only a line number.
CAMLE A,NUMTTY+HSTPGA ; Make sure it's in range.
RET ; This line number isn't in the TTYINI file.
IMUL A,BLKSIZ+TTYPGA ; Convert to an index to the block.
ADDI A,HSTPGA ; Point to the block.
AOS A ; Skip the TTY counter.
ENDAV.
RETSKP ; Return done.
;NETMAP - Map a NET page.
;Call: A/ Network number.
;Ret: +1 - Failure, no TTYINI entries for this network number.
; +2 - Success, NETPAG containing the NET page for this network.
NETMAP: SKIPG A,NETADR+TTYPGA(A) ; If there's not an entry in the NET
RET ; index for this terminal's network, return bad
CAMN A,MAPNET ; Is this the mapped net?
IFSKP. ; No.
SKIPG MAPNET ; Is there a mapped net page?
IFSKP.
PUSH P,A
SETOM A ; Yes, unmap the old net page.
MOVE B,[.FHSLF,,NETPAG]
SETZM C
PMAP%
POP P,A ; Get back the page to map.
ENDIF.
MOVEM A,MAPNET ; Flag which page we've got mapped now.
HRL A,NETJFN ; Map the new net page.
MOVE B,[.FHSLF,,NETPAG]
MOVX C,PM%RD!PM%WR!PM%PLD
PMAP%
ENDIF.
RETSKP
;HSTMAP - Map a host's TTYINI data.
;Call: A/ Host number.
; NETPAG containing host indices for host's net.
; NETJFN open on TTYINI data file.
;Ret: +1 - Failure, no TTYINI entries for this host.
; +2 - Success, HSTPAG and subsequent pages containing host's TTYINI data
HSTMAP: STKVAR <TMPHST>
SKIPG A,NETPGA(A) ; Get page number for this host's TTYINI data.
RET ; No TTYINI data for this host.
TLNN A,-1 ;Is this a pointer to another host?
IFSKP. ;Yes...
HRRZM A,TMPHST ;Save the host number
HLRZS A ;Get net number in A
CALL NETMAP ;Map in that pagey
RET ;It failed, so say we failed
MOVE A,TMPHST ;Get back host number
HRRZS A ;Isolate it
JRST HSTMAP ;Go try this one
ENDIF.
CAMN A,MAPHST ; Is this the mapped host?
IFSKP.
SKIPG MAPHST ; No, is there a mapped host?
IFSKP.
PUSH P,A
SETOM A ; Yes, unmap the mapped host information.
MOVE B,[.FHSLF,,HSTPAG]
SKIPE C,NUMHST
TXO C,PM%CNT
PMAP%
POP P,A
ENDIF.
MOVEM A,MAPHST ; Flag which host we've got mapped.
HRL A,NETJFN ; Map the first page of this host's data.
MOVE B,[.FHSLF,,HSTPAG]
MOVX C,PM%RD!PM%WR!PM%PLD
PMAP%
MOVE C,NUMTTY+HSTPGA ; Get number of TTYINI blocks for this host.
IMUL C,BLKSIZ+TTYPGA ; Get the total words we are going to use.
AOS C ; Count the count word.
LSH C,-↑D9 ; Get a page count in C.
AOS C ; Adjust the page count to reflect reality.
MOVEM C,NUMHST ; Save this for unmapping code.
CAIN C,1 ; Is there more than one page of host info?
IFSKP. ; Yes...
AOS A ; Map the subsequent pages of host info.
AOS B
TXO C,PM%CNT!PM%WR!PM%RD
PMAP%
ENDIF.
ENDIF.
RETSKP ; Done here.
;GETBIN -- get default data from binary file TTYINI.NET-BIN
; No parameters on entry.
;Ret: +1 - Error, E.G. file not found, or bad format
; +2 - First page of file mapped at TTYPAG
GETBIN: MOVX A,GJ%OLD!GJ%SHT ; Get JFN for the file.
HRROI B,[ASCIZ/SYSTEM:TTYINI.NET-BIN/]
GTJFN%
ERJMP R ; No file.
HRRZM A,NETJFN ; Open it.
MOVX B,FLD(↑D36,OF%BSZ)!OF%RD
OPENF%
IFJER. ; Someone must be writing it.
RLJFN%
JFCL ; Loser...
RET
ELSE.
HRLZ A,A ; Now map the first page of the file.
MOVE B,[.FHSLF,,TTYPAG]
MOVX C,PM%RD!PM%PLD
PMAP%
IFNJE.
MOVE A,OURLIN ; Get our line number.
CALL BINLOC ; Figure out where our data is.
IFSKP.
AOS (P) ; Indicate we're winning.
CALL BINRD ; Process binary file now
ENDIF.
ENDIF.
SETOM A ; Now unmap first page.
MOVE B,[.FHSLF,,TTYPAG]
SETZM C
PMAP%
ERJMP .+1
SKIPG MAPNET ; Is there a NET page mapped?
IFSKP.
MOVE B,[.FHSLF,,NETPAG] ; Yes, unmap it.
PMAP%
ERJMP .+1
ENDIF.
SKIPG MAPHST ; Is there host information mapped?
IFSKP.
MOVE B,[.FHSLF,,HSTPAG] ; Yes, unmap it.
SKIPE C,NUMHST
TXO C,PM%CNT
PMAP%
ERJMP .+1
ENDIF.
MOVE A,NETJFN ; Now close the JFN.
CLOSF%
IFJER.
MOVE A,NETJFN ; Release it if we lose.
RLJFN%
JFCL
ENDIF.
ENDIF.
SETOM NETJFN ; Show no more JFN.
RET
SUBTTL Write binary file from raw data file
$BINMK: CONFIRM ; Wait for confirmation.
SETOM BINFLG ; Flag that we're creating a binary file.
AOS CHANGE ; This needs twiddling for some reason.
TMSG <Generating network TTYINI binary file...> ; Say what we're doing.
MOVX A,GJ%SHT!GJ%NEW!GJ%FOU ; Get a JFN for the new TTYINI.NET-BIN.
HRROI B,[ASCIZ/SYSTEM:TTYINI.NET-BIN/]
GTJFN%
IFJER.
TMSG <
?Can't get JFN for SYSTEM:TTYINI.NET-BIN>
JRST CNTCON
ELSE.
MOVEM A,NETJFN ; Save JFN for the file.
MOVX B,OF%WR!OF%RD!FLD(↑D36,OF%BSZ) ; Open it.
OPENF%
IFJER.
TMSG <
?Can't get JFN for SYSTEM:TTYINI.NET-BIN>
JRST CNTCON
ELSE.
SETOM VERSION+TTYPGA ; Initialize the data structure.
MOVE A,[VERSION+TTYPGA,,VERSION+TTYPGA+1]
BLT A,VERSION+TTYPGA+777
MVI. B%DEFL,BLKSIZ+TTYPGA ; Number of words per TTY block.
MVI. B%VNO,VERSION+TTYPGA ; Version number of TTYINI.NET-BIN.
SETOM MAPNET ; Say no net page mapped.
SETOM MAPHST ; Say no mapped host pages.
SETZM FILPAG ; Zero file page counter.
MOVE A,[.FHSLF,,TTYPAG] ; Make the first page of the file.
HRLZ B,NETJFN
MOVX C,PM%WR!PM%RD
PMAP%
EXCH A,B ; Map it right back in.
MOVX C,PM%WR!PM%RD
PMAP%
ENDIF.
ENDIF.
JRST COMDON ; Join parse loop.
; Here to process a line of the raw data file.
BINLIN: MOVEM B,THELIN ; Save file's TTY number.
DO.
FIELD(COMAND,TRMERR)
HRRZ B,(B)
MOVE A,B
HRRZ C,C
CAIE C,COMAND ; Confirmation?
IFSKP.
CALL BINWRT ; Process this line of data if so.
JRST FILLOP
ENDIF.
CAIN C,COMTYP ; Parsed a TTY type?
MOVEI A,SETTYP
CALL (A) ; Call routine to fetch TTY type in B.
JRST COMERR ; Oops.
LOOP.
ENDDO.
; Process all local versions set for this line.
BINWRT: ACVAR TTYPTR
HRRZ A,THELIN ; Get line number.
CAMLE A,NUMTTY+HSTPGA ; Larger than number of TTYs seen so far?
MOVEM A,NUMTTY+HSTPGA ; Yes.
MOVE A,THELIN ; Get full TTY line descriptor back.
CALL BINLOC ; Find base of data for that line (into A).
IFSKP.
MOVE TTYPTR,A ; Get pointer to the data for TTY line.
SKIPLE B,TYPE ; Set type if known.
CALL (B)
MOVEM B,B%TTYTYPE(TTYPTR)
SKIPLE B,DTYPE ; Set /DEFAULT: if known.
CALL (B) ; N.B. We set flags based on default type!
MOVEM B,B%DEFTTYTYPE(TTYPTR)
MV. LENGTH,B%LENGTH(TTYPTR) ; Set /LENGTH:
MV. WIDTH,B%WIDTH(TTYPTR) ; Set /WIDTH:
MV. LINEF,B%DPLXMODE(TTYPTR) ; Set duplex mode
SETZB B,C ; Start with false in all
TXO B,B%LOWERCASE!B%COMMANDPAUSE!B%PAGEPAUSE ; Some default to on
SKIPN LOWERF ; Clear /LOWER?
TXZ B,B%LOWERCASE ; Yes.
SKIPN PAUSEF ; Clear /PAUSE-AT-END-OF-PAGE?
TXZ B,B%PAGEPAUSE ; Default to on.
SKIPN CTLSF ; Clear /PAUSE-ON-COMMAND?
TXZ B,B%COMMANDPAUSE ; Yes.
MOVEI D,1 ; Get a "true" value for comparison.
CAMN D,FORMF ; Set these flags accordingly...
TXO B,B%FORMFEED
CAMN D,TABF
TXO B,B%TABS
CAMN D,RAISEF
TXO B,B%RAISE
CAMN D,FLAGF
TXO B,B%FLAG
IFN LOTSW!GSBSW,<
CAMN D,ASSIG
TXO B,B%ASSIGNABLE
CAMN D,OVERH
TXO B,B%OVERHEAD
CAMN D,CONSU
TXO B,B%CONSULTANT
CAMN D,EXPRE
TXO B,B%EXPRESS
CAMN D,OPERA
TXO B,B%OPERATOR
>;IFN LOTSW!GSBSW
CAMN D,REFSYS
TXO B,B%REFUSE
DMOVEM B,B%BITS(TTYPTR) ; Finally, save all the bits.
HRROI A,B%ADDR(TTYPTR) ; Set up address string for FINGER.
HRROI B,ADDRE
MOVEI C,5*6
SETZ D,
SOUT%
DMOVE A,PRINT ; Fetch node (two words).
DMOVEM A,B%PRINT(TTYPTR) ; Set up DECNET node.
MV. LOCAT,B%LOCATION(TTYPTR)
HRLZI A,-8 ; Number of directions.
HRR B,TTYPTR
DO.
MV. DIRARR(A),B%NEIGHBOR(B) ; Set an entry.
AOS B
AOBJN A,TOP.
ENDDO.
ELSE.
JSMSG <Invalid line number specified>
JRST COMLOP ; Oops. Invalid line number
ENDIF.
ENDAV.
RET
; Here to finish saving data in the binary file.
MAKBIN: SETOM A ; Unmap all pages we've got in memory.
MOVE B,[.FHSLF,,NETPAG]
SETZM C
PMAP%
MOVE C,NUMTTY+HSTPGA ; Calculate number of pages over HSTPAG to map.
IMUL C,BLKSIZ+TTYPGA
AOS C
LSH C,-↑D9
IFN. C ; If there's at least one page...
MOVE A,[.FHSLF,,HSTPAG+1] ; Unmap host's TTYINI data now.
HRL B,NETJFN
HRR B,FILPAG
AOS B
TXO C,PM%CNT!PM%WR
PMAP%
ENDIF.
MOVE B,[.FHSLF,,HSTPAG] ; Now unmap the first page of the TTYINI data.
SETZM C
PMAP%
HRRI B,TTYPAG ; Finally, the first page of the file.
PMAP%
MOVE A,NETJFN ; Close the file now.
CLOSF%
IFJER.
TMSG <
?Fatal error closing TTYINI.NET-BIN>
JRST CNTCON
ENDIF.
TMSG <[OK]> ; Signal that all went okay.
RET ; Return to caller.
; Get local host
INIHST: MOVE A,[SIXBIT \PUPROU\] ;Pup routing table
SYSGT% ;Get table length, first entry in table
JUMPE B,CNTCON ;If zero then no such table
HRRZM B,D ;Save table number
HLLZS B ;Set up AOBJN pointer
JRST ETHNM ;Already have first entry
DO.
HRL A,B ;Left half of A is index
HRR A,D ;Right half is table number
GETAB% ;Get the table entry
ERJMP CNTCON ;Failed, can't find ourselves
ETHNM: HRRZS A ;Clear left to only get host num
JUMPN A,ENDLP. ;Go out if done
AOBJN B,TOP. ;Otherwise try next one
JRST CNTCON ;Shut down, can't find self
ENDDO.
HRRM A,LCLHST ;Copy host number
HRRI A,1(B) ;Get the net number
MOVEM A,LCLNET ;Save it too
RET
.ENDPS TTCODE
END XWD EVL,EV